/**
 * Created by 白雨浓 on 2019/7/8 14:37.
 */
/**
 * 处理数据类型
 * @param dataType 数据类型
 * @param columnType 字段类型
 * @returns {string}
 */
const handleDataType = (dataType, columnType) => {

  const res = /\d+/g.exec(columnType);
  const length = parseInt(res ? res[0] : 0);

  switch (dataType) {
    case 'varchar':
    case 'text':
    case 'tinytext':
    case 'mediumtext':
    case 'longtext':
      return 'String';

    case 'char':
      return 'Char';

    case 'int':
      return 'Integer';
    case 'bigint':
      return 'Long';
    case 'tinyint':
      return length === 1 ? 'Boolean' : 'Integer';

    case 'float':
      return 'Float';
    case 'double':
      return 'Double';
    case 'decimal':
      return 'BigDecimal';

    case 'datetime':
    case 'timestamp':
      return 'Date';

    case 'enum':
      return 'Enum';

    case 'json':
      return 'Map<String,Object>';

    case 'blob':
    case 'mediumblob':
      return 'Object';

    default:
      return 'Object';
  }

};

/**
 * 处理验证
 * @param javaDataType JAVA数据类型
 * @param columnComment 字段注释
 * @returns {Object}
 */
const handleValid = (javaDataType, columnComment) => {

  let anno;
  switch (javaDataType) {
    case 'String':
      anno = 'NotBlank';
      break;
    case javaDataType.includes('Map<'):
    case javaDataType.includes('List<'):
    case javaDataType.includes('Set<'):
      anno = 'NotEmpty';
      break;
    default:
      anno = 'NotNull';
      break;
  }

  return {
    anno,
    msg: columnComment ? columnComment.split(' ')[0] : '{REPLACE}',
  }
};

/**
 * 处理额外属性
 * @param column
 * @returns {string}
 */
const handleExtra = (column) => {

  const extra = [];

  extra.push(column.IS_NULLABLE === 'YES' ? '可空' : '非空');

  if (column.COLUMN_DEFAULT) {
    extra.push(`默认:${column.COLUMN_DEFAULT}`)
  }

  switch (column.COLUMN_KEY) {
    case 'PRI':
      extra.push('主键');
      break;
    case 'UNI':
      extra.push('唯一');
      break;
    case 'MUL':
      extra.push('索引');
      break;
  }

  return extra.join(', ');
};

export { handleDataType, handleValid, handleExtra }
